home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / dprint / dpstdlib.c < prev    next >
Text File  |  1994-08-11  |  6KB  |  312 lines

  1. /*
  2. 8086|Printman/POSTCARD 汎用下請けモジュール
  3.  
  4. Copyright (c) 1993,94 Delmonta
  5.  
  6. */
  7.  
  8. #include<stdlib.h>
  9. #include<jctype.h>
  10. #include"dprint.h"
  11.  
  12. /*---------------------------------------------------------------------------*/
  13.  
  14. void    card_reshow(bitmap val)
  15. {
  16.     int    i;
  17.  
  18.     struct POSTCARD    pcard;
  19.  
  20.     if    (Cardnum == Cardpos)
  21.     {
  22.         pcard.zipcode[0] = -1;
  23.  
  24.         for    (i=0 ; i<DATANUM ; i++)
  25.             pcard.data[i][0] = '\0';
  26.     }
  27.     else
  28.         pcard = *Card[Cardpos];        /* 構造体の一括コピー */
  29.  
  30.     if    (val & 1)
  31.     {
  32.         printf("\033[6;33f");
  33.  
  34.         if    (pcard.zipcode[0]==-1)        /* 郵便番号なし */
  35.             printf("   -  \n");
  36.         else if    (pcard.zipcode[1]==-1)        /* 上3桁のみ  */
  37.             printf("%03d-  \n",pcard.zipcode[0]);
  38.         else                    /* 5桁とも指定 */
  39.             printf("%03d-%02d\n",
  40.                     pcard.zipcode[0],pcard.zipcode[1]);
  41.     }
  42.  
  43.     for    (i=0 ; i<DATANUM ; i++)
  44.     {
  45.         if    (val & (2<<i))
  46.             printf("\033[%d;33f%-24s\n",i+7,pcard.data[i]);
  47.     }
  48. }
  49.  
  50. /*---------------------------------------------------------------------------*/
  51.  
  52. void    dp_putcardnum(void)
  53. {
  54.     printf("\033[24;62f\033[7;37m" "カード %4u/%4u" "\033[0m",
  55.                             Cardpos+1,Cardnum);
  56. }
  57.  
  58. static    char        Ungetch_buf[2];
  59. static    unsigned    Ungetch_num;
  60.  
  61. /*---------------------------------------------------------------------------*/
  62.  
  63. void    dp_ungetch(char c)
  64. {
  65.     Ungetch_buf[Ungetch_num++] = c;
  66. }
  67.  
  68. char    dp_getch(void)
  69. {
  70.     void    exit(int);
  71.     char    c;
  72.  
  73.     if    (Ungetch_num)        /* バッファに文字がたまっているか */
  74.         return Ungetch_buf[--Ungetch_num];
  75.  
  76. rep:
  77.     c = getch();
  78.  
  79.     if    (c==3)
  80.         exit(EXITCODE_CTRLC);
  81.  
  82.     if    (c=='\033' && kbhit())    /* 特殊キーか */
  83.         return EXTKEY_H;
  84.  
  85.     else if    (c=='\0')        /* IBM PCの特殊キーコードは0x00で */
  86.     {                /* はじまり、EXTKEY_Hと混同して誤 */
  87.         putchar('\7');        /* 動作する可能性がある           */
  88.         getch();
  89.         goto rep;
  90.     }
  91.  
  92.     switch    (c)    /* キャラクタコード変換 */
  93.     {
  94.     case '\n':    c = DOWNKEY;    break;    /* 98→TOWNS            */
  95.     case 'K'-0x40:    c = UPKEY;    break;
  96.     case 'L'-0x40:    c = RIGHTKEY;    break;
  97.  
  98.     case '\x1d':    c = LEFTKEY;    break;    /* TOWNS→98            */
  99.                         /* BSを処理するため     */
  100.  
  101.     case 'E'-0x40:    c = UPKEY;    break;    /* ダイヤモンドカーソル */
  102.     case 'S'-0x40:    c = LEFTKEY;    break;
  103.     case 'D'-0x40:    c = RIGHTKEY;    break;
  104.     case 'X'-0x40:    c = DOWNKEY;    break;
  105.     }
  106.  
  107.     return c;
  108. }
  109.  
  110. /*---------------------------------------------------------------------------*/
  111.  
  112. char    dp_errmes(const char *s)
  113. {
  114.     char    c;
  115.  
  116.     printf("\033[%d;1f\033[K\033[33m%s",ERRMES_LINE,s);
  117.  
  118.     c = dp_getch();
  119.     if    (c==EXTKEY_H)            /* 特殊キーの入力を捨てる */
  120.     {
  121.         dp_getch();
  122.     }
  123.     printf("\033[37m\033[2K\n");
  124.  
  125.     return c;
  126. }
  127.  
  128. /*---------------------------------------------------------------------------*/
  129.  
  130. bool    strinput(char *buf,unsigned len)
  131. {
  132.     unsigned    strlen(char *);
  133.  
  134.     int        _ctypebuf[80];
  135.     int        *ctypebuf = _ctypebuf + 1;
  136.  
  137.     unsigned    l = 0;    /* 入力中の文字列の長さ */
  138.     unsigned    i;
  139.     char        c;
  140.  
  141.     _ctypebuf[0] = CT_ANK;
  142.  
  143.     while    ((c=*buf)!='\0')
  144.     {
  145.         putchar(c);
  146.  
  147.         *ctypebuf = chkctype(c,*(ctypebuf-1));
  148.  
  149.         buf++;
  150.         ctypebuf++;
  151.         l++;
  152.     }
  153.  
  154.     for    (i=l ; i<len ; i++)
  155.         putchar(' ');
  156.  
  157.     for    (i=l ; i<len ; i++)
  158.         putchar('\010');
  159.  
  160. strin_keyrep:
  161.  
  162.     c = dp_getch();
  163.  
  164.     if    (c=='\010' && l)
  165.     {
  166.         do
  167.         {
  168.             printf("\010 \010");
  169.             l--;
  170.             buf--;
  171.         } while( *--ctypebuf==CT_KJ2 || *ctypebuf==CT_ILGL);
  172.  
  173.     }
  174.     else if    (c=='\r' || c=='\033')
  175.     {
  176.         *buf = '\0';
  177.  
  178.         if    (c=='\r')
  179.             return TRUE;
  180.         else
  181.             return FALSE;
  182.     }
  183.     else if    (c>=' ' && l<len)
  184.     {
  185.         *ctypebuf = chkctype(c,*(ctypebuf-1));
  186.  
  187.         if    (*ctypebuf == CT_KJ1 && l==len-1)
  188.         {            /* バッファの最後に漢字の第1バイトが */
  189.             dp_getch();    /* 来た場合はその漢字全体を捨てる     */
  190.             putchar('\7');
  191.         }
  192.         else
  193.         {
  194.             l++;
  195.             *buf++ = c;
  196.             ctypebuf++;
  197.             putchar(c);
  198.         }
  199.     }
  200.     else
  201.     {
  202.         if    (c==EXTKEY_H)    /* 特殊キーのコードは捨てる */
  203.             dp_getch();
  204.  
  205.         putchar('\7');
  206.     }
  207.     goto strin_keyrep;
  208. }
  209.  
  210. /*---------------------------------------------------------------------------*/
  211.  
  212. bool    addcard(unsigned cardpos)
  213. {
  214.     int        i;
  215.     void    far    *farmalloc(long);
  216.     struct POSTCARD    far *p;
  217.  
  218.     if    (cardpos>=MAXCARD)
  219.     {
  220.         dp_errmes("これ以上カードは増やせません.");
  221.         return FALSE;
  222.     }
  223.  
  224.     p = (struct POSTCARD far *)farmalloc(sizeof(struct POSTCARD)) + 0L;
  225.     if    (p==NULL)
  226.     {
  227.         dp_errmes("メモリ不足です.");
  228.         return FALSE;
  229.     }
  230.  
  231.     Card[cardpos] = p;
  232.  
  233.     p->zipcode[0] = p->zipcode[1] = -1;
  234.     for    (i=0 ; i<5 ; i++)
  235.         p->data[i][0] = '\0';
  236.  
  237.     return TRUE;
  238. }
  239.  
  240. /*---------------------------------------------------------------------------*/
  241.  
  242. int    dp_getval(void)
  243. {
  244.     char    buf[5];
  245.     buf[0] = '\0';
  246.  
  247.     if    (strinput(buf,4) && buf[0]!='\0')
  248.     {
  249.         int    a = atoi(buf);
  250.  
  251.         if    (a<0)
  252.             a = -a;
  253.  
  254.         return a;
  255.     }
  256.     else
  257.         return -1;
  258. }
  259.  
  260. /*---------------------------------------------------------------------------*/
  261.  
  262. bool    dp_getval2(fract *val)
  263. {
  264.     unsigned    strlen(char *);
  265.     fract        i;
  266.     char        buf[8];
  267.  
  268. getval2_rep:
  269.     buf[0] = '\0';
  270.  
  271.     if    (!strinput(buf,sizeof(buf)-1))
  272.         return FALSE;
  273.     else
  274.     {
  275.         i = dpatoi(buf);
  276.         if    (i==DPATOI_ERROR)
  277.         {
  278.  
  279.             for    ( i=strlen(buf) ; i>0 ; i--)
  280.                 printf("\010 \010");
  281.  
  282.             goto getval2_rep;
  283.         }
  284.     }
  285.  
  286.     *val = i;
  287.     return TRUE;
  288. }
  289.  
  290. /*---------------------------------------------------------------------------*/
  291.  
  292. bool    iscardexist(void)
  293. {
  294.     if    (Cardnum>0)
  295.         return TRUE;
  296.  
  297.     dp_errmes("カードがありません.");
  298.     return FALSE;
  299. }
  300.  
  301. /*---------------------------------------------------------------------------*/
  302.  
  303. void    *dp_malloc(size_t len)
  304. {
  305.     void    *p = malloc(len);
  306.  
  307.     if    (p==NULL)
  308.         dp_errmes("メモリ不足です");
  309.  
  310.     return p;
  311. }
  312.